package ro.inf.bomberman;

/**
 * Das Spielfeld wird in Field-Objekte unterteilt. Sie stellen die
 * Logik für Felder auf dem Spielfeld zur Verfügung.
 * @author Michi
 */
public class Field {

    private Size size = new Size(40, 40);
    private Coordinate coord;
    private Object objectOnField = null;
    private Object bombOnField = null;

    /**
     * Konstruktor der Field Klasse.
     *
     * @param x X-Koordinate des Feld-Objekts.
     * @param y Y-Koordinate des Feld-Objekts.
     */
    public Field(int x, int y) {
        this.coord = new Coordinate(x, y);
    }

    /**
     * Gibt die Größe des Feld-Objekts zurück.
     *
     * @return Size Die Größe es Feld-Objekts.
     */
    public Size getSize() {
        return this.size;
    }

    /**
     * Platziert ein neues Objekt auf dem aktuellen Feld.
     *
     * @author Michi
     * @param objectToRegister Object Spieler/Block
     * @return boolean true/false
     */
    public boolean registerObject(Object objectToRegister) {
        if (this.containsObject() == true) {
            return false;
        } else {
            this.objectOnField = objectToRegister;
            return true;
        }
    }

    /**
     * Gibt zurück, ob ein Objekt auf dem aktuellen Feld vorhanden ist.
     *
     * @author Michi
     * @return boolean true/false
     */
    public boolean containsObject() {
        if (this.objectOnField == null) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Löscht das Objekt vom aktuellen Feld (falls vorhanden).
     *
     * @author Michi
     * @param objectToRemove Das Objekt das vom Feld entfernt werden soll.
     * @return boolean true/false
     */
    public boolean removeObject(Object objectToRemove) {
        if (objectToRemove.equals(this.objectOnField)) {
            this.objectOnField = null;
            return true;
        } else {
            return false;
        }
    }

    /**
     * Prüft ob auf dem Feld eine Bombe liegt oder nicht.
     *
     * @author Michi
     * @return boolean true wenn das feld bereits eine Bombe enthält.
     */
    public boolean containsBomb() {
        if (this.bombOnField != null) {
            return true;
        }
        return false;
    }

    /**
     * Entfernt eine Bombe aus einem Feld, wenn das Objekt das übergeben wurde
     * das selbe Bomben-Object ist.
     *
     * @author Michi
     * @param bombToRemove Die Bombe, die die Entfernung auslöst
     * @return True wenn die Bombe entfernt wurde
     */
    public boolean removeBomb(Object bombToRemove) {
        if (bombToRemove.equals(this.bombOnField)) {
            this.bombOnField = null;
            return true;
        }
        return false;
    }

    /**
     * Registriert eine Bombe auf dem Feld.
     *
     * @author Michi
     * @param bombToRegister Das Bomben Objekt das gelegt werden soll.
     * @return boolean True/False ob der Befehl erfolgreich war.
     */
    public boolean registerBomb(Object bombToRegister) {
        if (this.containsBomb() == false) {
            this.bombOnField = bombToRegister;
            return true;
        }
        return false;
    }

    /**
     * Gibt das Objekt, das auf dem Feld registriert ist zurück. Prüft NICHT ob
     * das Object null ist
     *
     * @author Michi
     * @return Object Das Objekt das auf dem Feld registriert ist.
     */
    public Object getRegisteredObject() {
        return this.objectOnField;
    }

    /**
     * Gibt die Bombe, die auf dem Feld registriert ist zurück. Prüft NICHT ob
     * das Object null ist.
     *
     * @author Michi
     * @return Object Die Bombe, die auf dem Feld registriert ist.
     */
    public Object getRegisteredBomb() {
        return this.bombOnField;
    }

    /**
     * Gibt die Position des Feldes zurück.
     *
     * @return Coordinate Position des Feldes.
     */
    public Coordinate getPosition() {
        return this.coord;
    }
}
